package org.example.onlinejudge.controller;

import org.example.onlinejudge.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

/**
 * 注册控制器
 * 负责处理用户注册相关的请求和响应
 * 实现逻辑：
 * 1. 提供注册页面展示
 * 2. 处理用户注册请求，包括表单验证（用户名、密码、邮箱格式等）
 * 3. 支持教师（角色代码1）和学生（角色代码2）两种角色的注册
 * 4. 注册成功后重定向到登录页面，并传递角色代码参数
 * 5. 使用RedirectAttributes处理错误信息，确保页面刷新后错误信息依然可见
 */
@Controller
public class RegisterController {

    @Autowired
    private UserService userService;

    /**
     * 显示注册页面
     */
    @GetMapping("/register")
    public String showRegisterPage(@RequestParam(value = "success", required = false) String success,
                                   Model model) {
        if (success != null) {
            model.addAttribute("message", "注册成功！请登录");
        }
        return "register";
    }

    /**
     * 处理注册请求
     */
    @PostMapping("/perform_register")
    public String register(@RequestParam("username") String username,
                          @RequestParam("password") String password,
                          @RequestParam("confirmPassword") String confirmPassword,
                          @RequestParam(value = "email", required = false) String email,
                          @RequestParam(value = "nickname", required = false) String nickname,
                          @RequestParam(value = "role", defaultValue = "2") String roleCode,
                          RedirectAttributes redirectAttributes) {
        
        // 验证用户名
        if (username == null || username.trim().isEmpty()) {
            redirectAttributes.addFlashAttribute("error", "用户名不能为空");
            return "redirect:/register";
        }

        // 验证用户名格式
        if (!username.matches("^[a-zA-Z0-9_]{3,20}$")) {
            redirectAttributes.addFlashAttribute("error", "用户名格式不正确（3-20个字符，仅支持字母、数字、下划线）");
            return "redirect:/register";
        }

        // 验证密码
        if (password == null || password.trim().isEmpty()) {
            redirectAttributes.addFlashAttribute("error", "密码不能为空");
            return "redirect:/register";
        }

        // 验证密码长度
        if (password.length() < 6) {
            redirectAttributes.addFlashAttribute("error", "密码长度至少为6位");
            return "redirect:/register";
        }

        // 验证两次密码是否一致
        if (!password.equals(confirmPassword)) {
            redirectAttributes.addFlashAttribute("error", "两次输入的密码不一致");
            return "redirect:/register";
        }

        // 验证邮箱格式（如果填写了邮箱）
        if (email != null && !email.trim().isEmpty()) {
            if (!email.matches("^[A-Za-z0-9+_.-]+@(.+)$")) {
                redirectAttributes.addFlashAttribute("error", "邮箱格式不正确");
                return "redirect:/register";
            }
        }

        // 验证角色代码
        if (!roleCode.equals("1") && !roleCode.equals("2")) {
            redirectAttributes.addFlashAttribute("error", "无效的角色选择");
            return "redirect:/register";
        }

        System.out.println("\n========== RegisterController: 开始处理注册请求 ==========");
        System.out.println("用户名: " + username);
        System.out.println("角色代码: " + roleCode);
        
        try {
            // 创建用户并分配选定的角色
            System.out.println("→ 调用 userService.createUserWithRole()");
            userService.createUserWithRole(username, password, email, nickname, roleCode);
            
            System.out.println("✅ 注册成功，准备重定向到登录页");
            System.out.println("========== RegisterController: 处理完成 ==========\n");
            
            // 注册成功，重定向到登录页面
            // 传递角色代码而不是中文名称，避免URL编码问题
            return "redirect:/login?register=success&roleCode=" + roleCode;
        } catch (IllegalArgumentException e) {
            // 业务异常（如用户名已存在）
            System.out.println("❌ 注册失败（业务异常）: " + e.getMessage());
            System.out.println("========== RegisterController: 处理完成 ==========\n");
            redirectAttributes.addFlashAttribute("error", e.getMessage());
            return "redirect:/register";
        } catch (Exception e) {
            // 其他异常
            System.out.println("❌ 注册失败（系统异常）: " + e.getMessage());
            e.printStackTrace(); // 打印异常信息便于调试
            System.out.println("========== RegisterController: 处理完成 ==========\n");
            redirectAttributes.addFlashAttribute("error", "注册失败：" + e.getMessage());
            return "redirect:/register";
        }
    }
}


